# Copyright 2009-2015 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is part of the gdb testsuite.

#
# This test tests some i386 general instructions for reverse execution.
#

if ![supports_reverse] {
    return
}


if ![istarget "*86*-*linux*"] then {
    verbose "Skipping i386 reverse tests."
    return
}

standard_testfile

# some targets have leading underscores on assembly symbols.
set additional_flags [gdb_target_symbol_prefix_flags]

if {[prepare_for_testing $testfile.exp $testfile $srcfile \
	 [list debug $additional_flags]]} {
    return -1
}

set end_of_main          [gdb_get_line_number " end of main "]
set end_sse_test         [gdb_get_line_number " end sse_test "]
set end_ssse3_test       [gdb_get_line_number " end ssse3_test "]
set end_sse4_test         [gdb_get_line_number " end sse4_test "]

runto main

if [supports_process_record] {
    # Activate process record/replay
    gdb_test_no_output "record" "Turn on process record"
}

global hex
global decimal

#sse_test

gdb_test "break $end_sse_test" \
    "Breakpoint $decimal at .* line $end_sse_test\." \
    "set breakpoint at end of sse_test"

set test "continue to end of sse_test"
gdb_test_multiple "continue" $test {
    -re " end sse_test .*\r\n$gdb_prompt $" {
	pass $test
    }
    -re " Illegal instruction.*\r\n$gdb_prompt $" {
	untested i386-sse-reverse
	return -1
    }
}

gdb_test "reverse-step" "xorps.*" "reverse-step to xorps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xf000c00080008000f800c00080008000.*" \
    "verify xmm0 at end of sse_test"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x70004000000000007800400000000000.*" \
    "verify xmm1 at end of sse_test"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 at end of sse_test"

gdb_test "reverse-step" "xorpd.*" "reverse-step to xorpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xf000c00080008000f800c00080008000.*" \
    "verify xmm0 after reverse xorps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x80008000800080008000800080008000.*" \
    "verify xmm1 after reverse xorps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse xorps"

gdb_test "reverse-step" "unpckhps.*" "reverse-step to unpckhps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x8000800080008000fff00000ffc00000.*" \
    "verify xmm0 after reverse xorpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x80008000800080008000800080008000.*" \
    "verify xmm1 after reverse xorpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse xorpd"

gdb_test "reverse-step" "unpckhpd.*" "reverse-step to unpckhpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse unpckhps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x80008000800080008000800080008000.*" \
    "verify xmm1 after reverse unpckhps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse unpckhps"

gdb_test "reverse-step" "ucomiss.*" "reverse-step to ucomiss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse unpckhpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x80008000800080008000800080008000.*" \
    "verify xmm1 after reverse unpckhpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse unpckhpd"

gdb_test "reverse-step" "ucomisd.*" "reverse-step to ucomisd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse ucomiss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x80008000800080008000800080008000.*" \
    "verify xmm1 after reverse ucomiss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse ucomiss"

gdb_test "reverse-step" "packssdw.*" "reverse-step to packssdw"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse ucomisd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse ucomisd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xf000c000f800c000f000c000f000c000.*" \
    "verify xmm2 after reverse ucomisd"

gdb_test "reverse-step" "packsswb.*" "reverse-step to packsswb"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse packssdw"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse packssdw"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm2 after reverse packssdw"

gdb_test "reverse-step" "orps.*" "reverse-step to orps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0xfff00000ffc00000fff80000ffc00000.*" \
    "verify xmm0 after reverse packsswb"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse packsswb"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm2 after reverse packsswb"

gdb_test "reverse-step" "orpd.*" "reverse-step to orpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse orps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse orps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm2 after reverse orps"

gdb_test "reverse-step" "mulss.*" "reverse-step to mulss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse orpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse orpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm2 after reverse orpd"

gdb_test "reverse-step" "mulsd.*" "reverse-step to mulsd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse mulss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse mulss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm2 after reverse mulss"

gdb_test "reverse-step" "mulps.*" "reverse-step to mulps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse mulsd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff80000ffc00000fff80000ffc00000.*" \
    "verify xmm1 after reverse mulsd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff0000000000000fff00000ffc00000.*" \
    "verify xmm2 after reverse mulsd"

gdb_test "reverse-step" "mulpd.*" "reverse-step to mulpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse mulps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm1 after reverse mulps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff0000000000000fff00000ffc00000.*" \
    "verify xmm2 after reverse mulps"

gdb_test "reverse-step" "divss.*" "reverse-step to divss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0000000000000000fff80000ffc00000.*" \
    "verify xmm0 after reverse mulpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm1 after reverse mulpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff0000000000000fff0000000000000.*" \
    "verify xmm2 after reverse mulpd"

gdb_test "reverse-step" "divsd.*" "reverse-step to divsd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x00000000000000008000000080000000.*" \
    "verify xmm0 after reverse divss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xfff00000ffc00000fff00000ffc00000.*" \
    "verify xmm1 after reverse divss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff0000000000000fff0000000000000.*" \
    "verify xmm2 after reverse divss"

gdb_test "reverse-step" "divps.*" "reverse-step to divps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x00000000000000008000000080000000.*" \
    "verify xmm0 after reverse divsd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x00000000000000000000000080000000.*" \
    "verify xmm1 after reverse divsd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xfff0000000000000fff0000000000000.*" \
    "verify xmm2 after reverse divsd"

gdb_test "reverse-step" "divpd.*" "reverse-step to divpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x00000000000000008000000080000000.*" \
    "verify xmm0 after reverse divps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x00000000000000000000000080000000.*" \
    "verify xmm1 after reverse divps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xbff0000000000000bff0000000000000.*" \
    "verify xmm2 after reverse divps"

gdb_test "reverse-step" "cvtpd2ps.*" "reverse-step to cvtpd2ps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x00000000000000008000000080000000.*" \
    "verify xmm0 after reverse divpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xce80200000000000ce80200000000000.*" \
    "verify xmm1 after reverse divpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xbff0000000000000bff0000000000000.*" \
    "verify xmm2 after reverse divpd"

gdb_test "reverse-step" "cvtpd2dq.*" "reverse-step to cvtpd2dq"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a090807060504ffffffff.*" \
    "verify xmm0 after reverse cvtpd2ps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0xce80200000000000ce80200000000000.*" \
    "verify xmm1 after reverse cvtpd2ps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xbff0000000000000bff0000000000000.*" \
    "verify xmm2 after reverse cvtpd2ps"

gdb_test "reverse-step" "cvtdq2ps.*" "reverse-step to cvtdq2ps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a090807060504ffffffff.*" \
    "verify xmm0 after reverse cvtpd2dq"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0000000000000000ffffffffffffffff.*" \
    "verify xmm1 after reverse cvtpd2dq"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xbff0000000000000bff0000000000000.*" \
    "verify xmm2 after reverse cvtpd2dq"

gdb_test "reverse-step" "cvtdq2pd.*" "reverse-step to cvtdq2pd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a090807060504ffffffff.*" \
    "verify xmm0 after reverse cvtdq2ps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0000000000000000ffffffffffffffff.*" \
    "verify xmm1 after reverse cvtdq2ps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xffffffffffffffffffffffff00000000.*" \
    "verify xmm2 after reverse cvtdq2ps"

gdb_test "reverse-step" "comiss.*" "reverse-step to comiss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a090807060504ffffffff.*" \
    "verify xmm0 after reverse cvtdq2pd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0000000000000000ffffffffffffffff.*" \
    "verify xmm1 after reverse cvtdq2pd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xffffffffffffffffffffffff00000000.*" \
    "verify xmm2 after reverse cvtdq2pd"

gdb_test "reverse-step" "comisd.*" "reverse-step to comisd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a090807060504ffffffff.*" \
    "verify xmm0 after reverse comiss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0000000000000000ffffffffffffffff.*" \
    "verify xmm1 after reverse comiss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xffffffffffffffffffffffff00000000.*" \
    "verify xmm2 after reverse comiss"

gdb_test "reverse-step" "cmpss.*" "reverse-step to cmpss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse comisd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0000000000000000ffffffffffffffff.*" \
    "verify xmm1 after reverse comisd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xffffffffffffffffffffffff00000000.*" \
    "verify xmm2 after reverse comisd"

gdb_test "reverse-step" "cmpsd.*" "reverse-step to cmpsd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse cmpss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x00000000000000000000000000000000.*" \
    "verify xmm1 after reverse cmpss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0xffffffffffffffffffffffff00000000.*" \
    "verify xmm2 after reverse cmpss"

gdb_test "reverse-step" "cmpps.*" "reverse-step to cmpps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse cmpsd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x00000000000000000000000000000000.*" \
    "verify xmm1 after reverse cmpsd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x0f0e0d0c0b0a09082726252400000000.*" \
    "verify xmm2 after reverse cmpsd"

gdb_test "reverse-step" "cmppd.*" "reverse-step to cmppd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse cmpps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x0f0e0d0c0b0a09082726252400000000.*" \
    "verify xmm1 after reverse cmpps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x0f0e0d0c0b0a09082726252400000000.*" \
    "verify xmm2 after reverse cmpps"

gdb_test "reverse-step" "andps.*" "reverse-step to andps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse cmppd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19182726252400000000.*" \
    "verify xmm1 after reverse cmppd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x0f0e0d0c0b0a09082726252400000000.*" \
    "verify xmm2 after reverse cmppd"

gdb_test "reverse-step" "andpd.*" "reverse-step to andpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse andps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19182726252400000000.*" \
    "verify xmm1 after reverse andps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse andps"

gdb_test "reverse-step" "addsubps.*" "reverse-step to addsubps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse andpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19182726252423222120.*" \
    "verify xmm1 after reverse andpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse andpd"

gdb_test "reverse-step" "addsubpd.*" "reverse-step to addsubpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050423222120.*" \
    "verify xmm0 after reverse addsubps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19182726252423222120.*" \
    "verify xmm1 after reverse addsubps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse addsubps"

gdb_test "reverse-step" "addss.*" "reverse-step to addss"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse addsubpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19182726252423222120.*" \
    "verify xmm1 after reverse addsubpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse addsubpd"

gdb_test "reverse-step" "addsd.*" "reverse-step to addsd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse addss"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse addss"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse addss"

gdb_test "reverse-step" "addps.*" "reverse-step to addps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse addsd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse addsd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse addsd"

gdb_test "reverse-step" "addpd.*" "reverse-step to addpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse addps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse addps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse addps"


#ssse3_test

gdb_test "continue" \
    " end sse_test .*" \
    "continue to end of sse_test #2"

gdb_test "break $end_ssse3_test" \
    "Breakpoint $decimal at .* line $end_ssse3_test\." \
    "set breakpoint at end of ssse3_test"

set test "continue to end of ssse3_test"
gdb_test_multiple "continue" $test {
    -re " end ssse3_test .*\r\n$gdb_prompt $" {
	pass $test
    }
    -re " Illegal instruction.*\r\n$gdb_prompt $" {
	untested i386-ssse3-reverse
	return -1
    }
}

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm0 at end of ssse3_test"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 at end of ssse3_test"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm2 at end of ssse3_test"

gdb_test "reverse-step" "pabsd.*" "reverse-step to pabsd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse pabsd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse pabsd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm2 after reverse pabsd"

gdb_test "reverse-step" "pabsw.*" "reverse-step to pabsw"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse pabsw"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse pabsw"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm2 after reverse pabsw"

gdb_test "reverse-step" "pabsb.*" "reverse-step to pabsb"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse pabsb"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse pabsb"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse pabsb"


#sse4_test

gdb_test "continue" \
    " end ssse3_test .*" \
    "continue to end of ssse3_test #2"

gdb_test "break $end_sse4_test" \
    "Breakpoint $decimal at .* line $end_sse4_test\." \
    "set breakpoint at end of sse4_test"

set test "continue to end of sse4_test"
gdb_test_multiple "continue" $test {
    -re " end sse4_test .*\r\n$gdb_prompt $" {
	pass $test
    }
    -re " Illegal instruction.*\r\n$gdb_prompt $" {
	untested i386-sse4-reverse
        return -1
    }
}

gdb_test "reverse-step" "blendvps.*" "reverse-step to blendvps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09082726252413121110.*" \
    "verify xmm0 at end of sse4_test"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 at end of sse4_test"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 at end of sse4_test"

gdb_test "reverse-step" "blendvpd.*" "reverse-step to blendvpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09082726252413121110.*" \
    "verify xmm0 after reverse blendvps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse blendvps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse blendvps"

gdb_test "reverse-step" "blendps.*" "reverse-step to blendps"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09081716151413121110.*" \
    "verify xmm0 after reverse blendvpd"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse blendvpd"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse blendvpd"

gdb_test "reverse-step" "blendpd.*" "reverse-step to blendpd"

gdb_test "info register xmm0" \
    "xmm0 .*uint128 = 0x0f0e0d0c0b0a09080706050403020100.*" \
    "verify xmm0 after reverse blendps"

gdb_test "info register xmm1" \
    "xmm1 .*uint128 = 0x1f1e1d1c1b1a19181716151413121110.*" \
    "verify xmm1 after reverse blendps"

gdb_test "info register xmm2" \
    "xmm2 .*uint128 = 0x2f2e2d2c2b2a29282726252423222120.*" \
    "verify xmm2 after reverse blendps"
